export const config = {
  protocol: 'ws',
  host: '175.178.25.219',
  port: 6004,
  endpoint: '/mqtt',
  clean: true,
  connectTimeout: 30 * 1000,
  reconnectPeriod: 4000,
  clientId: 'emqx_vue_' + Math.random().toString(16).substring(2, 8),
  username: 'midService',
  password: '123',
}

/*
  需要订阅的主题
  设备锭子信息发布主题："WxProject/spindle/clientID/spininfo"
  设备数据上行主题："WxProject/spindle/clientID/dataup"
  设备数据下行主题："WxProject/spindle/clientID/datadown"
*/
export const subList = [
  { topic: 'WxProject/spindle/+/spininfo', qos: 0 },
  { topic: 'WxProject/spindle/+/dataup', qos: 0 },
  { topic: 'WxProject/spindle/+/datadown', qos: 0 },
]

/*
  依据消息的PackType字段值，将消息转发到不同的页面
*/
export const evbusMap = [
  { topicKeyWord: 'spininfo', packType: 'SpinInfo', relayEvent: ['Spindle'] },
  { topicKeyWord: 'dataup', packType: 'BaseInfo', relayEvent: ['MachineStatus'] },
  { topicKeyWord: 'dataup', packType: 'GetBaseCfg', relayEvent: ['rep-get-base-cfg'] },
  { topicKeyWord: 'dataup', packType: 'SetBaseCfg', relayEvent: ['rep-set-base-cfg'] },
]

export class MqttHelper {
  constructor(t) {
    if (MqttHelper.instance) {
      return MqttHelper.instance
    }
    this.client = t
    MqttHelper.instance = this
  }

  doPublish({ topic, qos, payload }) {
    /*
      MQTT中的QoS（Quality of Service）具体作用是确保消息的稳定传输。它提供了三种不同层次的服务质量（QoS）：
      QoS 0，即At most once，至多一次。这意味着消息发送方（Sender）发送一条消息后，接收方（Receiver）最多只能收到一次。
      如果消息发送失败，Sender不会进行重试。
  
      QoS 1，即At least once，至少一次。这意味着消息发送方发送一条消息后，接收方至少能收到一次。
      如果消息发送失败，Sender会进行重试以确保消息被接收。
  
      QoS 2，即Exactly once，确保只有一次。这意味着消息发送方发送一条消息后，接收方只能收到一次。
      如果消息发送失败，Sender会进行重试，但同时会检查消息的唯一性以防止重复接收。
    */
    // console.log('call doPublish', topic, qos, payload)
    return new Promise((resolve, reject) => {
      try {
        this.client.publish(topic, payload, { qos }, (error) => {
          if (error) {
            resolve({ code: -1, msg: '推送失败！', error })
          } else {
            resolve({ code: 0, msg: '推送成功！' })
          }
        })
      } catch (e) {
        console.log('推送失败：topic:', topic, 'qos:', qos)
        console.log('payload:', payload)
        console.log(e)
        resolve({ code: -1, msg: '推送失败！,详情请查看控制台' })
      }
    })
  }

  doSubscribe({ topic, qos }) {
    this.client.subscribe(topic, { qos }, (error, res) => {
      if (error) {
        // console.log(`${topic} 订阅失败`, error)
        return
      }
      // console.log(`${topic} 已订阅`)
    })
  }

  modelRebuild(d, t) {
    const nanFields = {
      SetBaseCfg: ['WorkMode', 'SpinOrder'],
    }

    let res = {}
    Object.keys(d).forEach((e) => {
      res[e] = nanFields[t].indexOf(e) > -1 ? d[e] : parseInt(d[e])
    })

    return res
  }
}
